# 在tensorflow源码中自带的一些例子，对使用tensorflow我觉得还是很有帮助
# first edit on 2019-8-21
# last change on 2019-8-23
# ATTENTION : 注意：每个实例都是独立的，不要一起运行哦
import tensorflow as tf

# api示例1，从run开始 源码位置:tensorflow/python/client/session.py
# tensorflow要调用run所有东西才会最终运行
a=tf.constant([10.0,20.0])
b=tf.constant([1.0,2.0])
tf.Session().run([a,b])       # run的第一个参数可以是一个singlelon
>>>[array([10., 20.], dtype=float32), array([1., 2.], dtype=float32)]

tf.Session().close()         # 如果没有使用with来调用run，那么每次结束都要调用一次close()来关闭session

# api示例2，matmul 源码位置:tensorflow/python/ops/math_ops.py
a=tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3])
b=tf.constant([7.0,8.0,9.0,10.0,11.0,12.0],shape=[3,2])
c=tf.matmul(a,b)
tf.Session().run(c)
>>>array([[ 58.,  64.],
       [139., 154.]], dtype=float32)

# 关闭session
tf.Session().close()

# api示例3，abs  源码位置:tensorflow/python/ops/math_ops.py  求绝对值
x=tf.constant([[-2.25],[-3.25]])
c=tf.abs(x)
tf.Session().run(c)
>>>array([[2.5 ],
       [3.25]], dtype=float32)

# 关闭session
tf.Session().close()

# api示例4，divide 源码位置:tensorflow/python/ops/math_ops.py  除法，这个除法其实就是x / y ,源码就是直接return x/y ,:)
a=tf.constant(4.0)
b=tf.constant(2.0)
c=tf.divide(a,b)

tf.Session().run(c)
>>>2.0

# 关闭session
tf.Session().close()

# api示例5 multiply ，源码位置:tensorflow/python/ops/gen_math_ops.py  乘法，源码就是直接返回x * y
a=tf.constant(2.0)
b=tf.constant(2.0)
c=tf.multiply(a,b)
tf.Session().run(c)
>>>4.0

# 关闭session
tf.Session().close()

# api示例6， subtract ,源码位置:tensorflow/python/ops/gen_math_ops.py  减法，源码直接返回 x - y
a=tf.constant(2.0)
b=tf.constant(2.0)
c=tf.subtract(a,b)
tf.Session().run(c)
>>>0.0

# 关闭session
tf.Session().close()

# api示例7-1 / 7-2 pow 源码位置:tensorflow/python/ops/math_ops.py 幂运算
# 7-1
x=tf.constant([[2,2],[3,3]])
y=tf.constant([8,16],[2,3])
c=tf.pow(x,y)    # x^y
tf.Session().run(c)
>>>array([[  256, 65536],
       [    9,    27]])

# 关闭session

# 7-2
a=tf.constant(3)
b=tf.constant(2)
c=tf.pow(a,b)   # a^b
tf.Session().run(c)
>>>9

# 关闭session
tf.Session().close()

# api示例8 complex 源码位置:tensorflow/python/ops/math_ops.py  两个实数转换成一个复数
a=tf.constant([2.25,3.25])    # 实数部分
b=tf.constant([4.75,5.75])    # 虚数部分
c=tf.complex(a,b)
tf.Session().run(c)
>>>array([2.25+4.75j, 3.25+5.75j], dtype=complex64)

# 关闭session
tf.Session().close()

# api示例9  real  源码位置:tensorflow/python/ops/math_ops.py  返回一个复数得实数部分
x=tf.constant([-2.25+4.75j,3.25+5.75j])
c=tf.real(x)
tf.Session().run(c)
>>>array([-2.25,  3.25])

# 关闭session
tf.Session().close()

# api示例10  imag 源码位置:tensorflow/python/ops/math_ops.py 返回一个复数的虚数部分
x=tf.constant([-2.25+4.75j,3.25+5.75j])
c=tf.imag(x)
tf.Session().run(c)
>>>array([4.75, 5.75])

# 关闭session
tf.Session().close()

# api示例11  angle  源码位置:tensorflow/python/ops/math_ops.py  不知道是什么，看不懂，传进去的是一个tensor
x=tf.constant([-2.25+4.75j,3.25+5.75j])
c=tf.angle(x)
tf.Session().run(c)
>>>array([2.01317055, 1.05634501])

# 关闭session
tf.Session().close()


# api12 round 源码位置:tensorflow/python/ops/math_ops.py  返回整数
x=tf.constant([0.9,2.5,2.3,1.5,-4.5])
c=tf.round(x)
tf.Session().run(c)
>>>array([ 1.,  2.,  2.,  2., -4.], dtype=float32)

# 关闭session
tf.Session().close()

# api13  cast  源码位置:tensorflow/python/ops/math_ops.py  数据类型转换
x=tf.constant([1.8,2.2],dtype=tf.float32)
c=tf.cast(x,tf.int32)
tf.Session().run(c)
>>>array([1, 2])

# 关闭session
tf.Session().close()

# api14-1 range 源码位置:tensorflow/python/ops/math_ops.py   生成一个序列的数字  
start=3       # 开始
limit=18      # 结束     这个参数可以为None的
delta=3       # 间隔
c=tf.range(start,limit,delta)   # limit这个参数可以为None的
tf.Session().run(c)
>>>array([ 3,  6,  9, 12, 15])

# 关闭session
tf.Session().close()

# api14-2 range 源码位置:tensorflow/python/ops/math_ops.py   生成一个序列的数字  
limit=18      # 结束
c=tf.range(limit)
tf.Session().run(c)
>>>array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17])

# 关闭session
tf.Session().close()


# api15 reduce_sum 源码位置:tensorflow/python/ops/math_ops.py   向量元素的相加
x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf.reduce_sum(x)  # 6
tf.reduce_sum(x, 0)  # [2, 2, 2]
tf.reduce_sum(x, 1)  # [3, 3]
tf.reduce_sum(x, 1, keepdims=True)  # [[3], [3]]
tf.reduce_sum(x, [0, 1])  # 6


# api16 count_nonzero  源码位置:tensorflow/python/ops/math_ops.py  统计向量中不为0的元素
x = tf.constant([[0, 1, 0], [1, 1, 0]])
tf.count_nonzero(x)  # 3
tf.count_nonzero(x, 0)  # [1, 2, 0]
tf.count_nonzero(x, 1)  # [1, 2]
tf.count_nonzero(x, 1, keepdims=True)  # [[1], [2]]
tf.count_nonzero(x, [0, 1])  # 3

# api17 reduce_variance 源码位置:tensorflow/python/ops/math_ops.py  源码中看不懂这个是什么用
x = tf.constant([[1., 2.], [3., 4.]])
tf.reduce_variance(x)  # 1.25
tf.reduce_variance(x, 0)  # [1., 1.]
tf.reduce_variance(x, 1)  # [0.25,  0.25]

# api18 reduce_std 源码位置:tensorflow/python/ops/math_ops.py   计算向量元素中的标准差
x = tf.constant([[1., 2.], [3., 4.]])
tf.reduce_std(x)  # 1.1180339887498949
tf.reduce_std(x, 0)  # [1., 1.]
tf.reduce_std(x, 1)  # [0.5,  0.5]

# api19 reduce_min 源码位置:tensorflow/python/ops/math_ops.py  计算向量中的最小值，源码中是调用numpy来计算
c=tf.reduce_min([1,2])
tf.Session().run(c)
>>>1

# 关闭session
tf.Session().close()

# api20 reduce_max 源码位置:tensorflow/python/ops/math_ops.py  计算向量中的最大值，源码中是调用numpy来计算
c=tf.reduce_max([1,2])
tf.Session().run(c)
>>>2

# 关闭session
tf.Session().close()

# api21 reduce_all  源码位置:tensorflow/python/ops/math_ops.py  逻辑门或与
x=tf.contant([[True,True],[False,False]])
c=tf.reduce_all(x)
tf.Session().run(c)
>>>False

# 关闭session
tf.Session().close()

# 其他例子
x = tf.constant([[True,  True], [False, False]])
tf.reduce_all(x)  # False
tf.reduce_all(x, 0)  # [False, False]
tf.reduce_all(x, 1)  # [True, False]

# api22 reduce_any  源码位置:tensorflow/python/ops/math_ops.py  与api21对应，逻辑门或与
x=tf.contant([[True,True],[False,False]])
c=tf.reduce_any(x)
tf.Session().run(c)
>>>True

# 关闭session
tf.Session().close()

# 其他例子
tf.reduce_any(x)  # True
tf.reduce_any(x, 0)  # [True, True]
tf.reduce_any(x, 1)  # [True, False]

# api23  reduce_logsumexp   源码位置:tensorflow/python/ops/math_ops.py  log(sum(exp(tensor)))
x = tf.constant([[0., 0., 0.], [0., 0., 0.]])
tf.reduce_logsumexp(x)  # log(6)
tf.reduce_logsumexp(x, 0)  # [log(2), log(2), log(2)]
tf.reduce_logsumexp(x, 1)  # [log(3), log(3)]
tf.reduce_logsumexp(x, 1, keepdims=True)  # [[log(3)], [log(3)]]
tf.reduce_logsumexp(x, [0, 1])  # log(6)

# api24   trace   源码位置:tensorflow/python/ops/math_ops.py    完全不知道这个是什么
x = tf.constant([[1, 2], [3, 4]])
tf.linalg.trace(x)  # 5

x = tf.constant([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
tf.linalg.trace(x)  # 15

x = tf.constant([[[1, 2, 3],
                    [4, 5, 6],
                    [7, 8, 9]],
                   [[-1, -2, -3],
                    [-4, -5, -6],
                    [-7, -8, -9]]])
tf.linalg.trace(x)  # [15, -15]


# api25 matvec  源码位置:tensorflow/python/ops/math_ops.py   矩阵乘向量
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
b = tf.constant([7, 9, 11], shape=[3])
c = tf.matvec(a, b)

# 这个在tensorflow-gpu 1.13.1中报错，说module 'tensorflow' has no attribute 'matvec'  但是源码中又有~~
# 解决办法：
c=tf.linalg.matvec(a,b)
tf.Session().run(c)
>>>array([ 58, 139])
# tensorflow issue解决地址：https://github.com/tensorflow/tensorflow/issues/31923
# 该API已迁移

# 关闭session
tf.Session().close()


# api26  accumulate_n  源码位置:tensorflow/python/ops/math_ops.py  张量相加